package 集合的补充知识.集合的并发修改异常问题;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        // 什么是集合的并发修改异常(可以类比数组,改变数组元素,索引也会改变,所以不安全,在迭代器中就会抛出异常)
        // 使用迭代器遍历集合时, 有同时在删除集合中的数据, 程序就会出现并发修改异常的错误
        List<String> list = new ArrayList<>();
        list.add("王麻子");
        list.add("小李子");
        list.add("李爱华");
        list.add("张全蛋");
        list.add("小丽");
        list.add("李玉刚");
        System.out.println(list);
        // 需求: 找出集合中全部带 "李"的名字, 并从集合中删除
//        for (String s : list) {
//            if (s.contains("李")) {
//                list.remove(s);
//            }
//        }// for增强遍历数组 (发生错误) ,并且无法解决(Lambda表达式也是这样)
//
//        // 这里发生这个异常(迭代器遍历)
//        Iterator<String> it = list.iterator();
//        while (it.hasNext()) {
//            String name = it.next();
//            if (name.contains("李")) {
//                list.remove(name);
//            }
//        }

        // 如何解决这个问题(类比数组)
        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i);
            if (name.contains("李")) {
                list.remove(name);
                i--;
            }
        }
        System.out.println(list);
        // 或者倒着删除(不会的看数组的那里)

        // 如果硬要使用迭代器,那么就不要用本身去删除,要使用迭代器本身的移除方法, 对象.remove();//删除迭代器当前遍历到的数据,没删除一个相当于也使用了一个i--

    }
}
